home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <string.h>
- #include <io.h>
-
- int searchfileFP (searchfor, fp, buf, entrysize, passes, searchlen)
- register char *searchfor;
- register FILE *fp;
- register char *buf;
- int entrysize, *passes, searchlen;
- {
- long size;
- register int start, result, found = 0;
- int index;
- char *cp;
- register int low = 0, high;
-
- if (passes)
- *passes = 0;
- if (!searchlen)
- searchlen = strlen (searchfor);
- size = filelength (fileno(fp));
- size /= entrysize;
- high = size - 1;
- index = start = size / 2;
- for ( ; ; ) {
- pwait (NULL);
- fseek (fp, (long) ((long)index * (long)entrysize), 0);
- fread (buf, 1, entrysize, fp);
- if (passes)
- (*passes)++;
- cp = strpbrk (buf, ".@ \t");
- if (cp)
- *cp = 0;
- result = strnicmp (searchfor, buf, searchlen);
- if (!result) {
- found = 1;
- break;
- }
- if (start != 1)
- start /= 2;
- if (result < 0) {
- high = index - 1;
- index -= start;
- } else {
- low = index + 1;
- index += start;
- }
- if (index < low || index > high)
- break;
- }
- if (found) { /* refresh it */
- fseek (fp, (long) ((long)index * (long)entrysize), 0);
- fread (buf, 1, entrysize, fp);
- }
- return ((found) ? index : -1);
- }
-
-
-
- int searchfile (searchfor, fname, buf, entrysize, passes, searchlen)
- register char *searchfor;
- char *fname;
- register char *buf;
- int entrysize, *passes, searchlen;
- {
- int result;
- FILE *fp;
-
- if ((fp = fopen (fname, "rb")) == NULL)
- return (-1);
- result = searchfileFP (searchfor, fp, buf, entrysize, passes, searchlen);
- fclose (fp);
- return (result);
- }
-
-
-
- #ifdef DEMO
- #define ENTRYSIZE 49
-
- int
- pwait (i)
- int i;
- {
- return i;
- }
-
-
- void
- main (argc, argv)
- int argc;
- char *argv[];
- {
- int found, passes;
- char buf[128], *searchfor;
-
- searchfor = "kp4djt";
- if (argc > 1)
- searchfor = argv[1];
- found = searchfile (searchfor, "/nos/spool/wpagebbs", buf, ENTRYSIZE, &passes);
-
- printf ("String '%s' %sfound - %d passes\n", searchfor, (found == -1) ? "NOT " : "", passes);
- if (found != -1) {
- buf[ENTRYSIZE] = 0;
- puts (buf);
- }
- }
- #endif
-